iT邦幫忙

2021 iThome 鐵人賽

DAY 2
0
Software Development

從零開始Reactive Programming- Spring系列 第 3

[Day 2] Reactive Programming - Programming paradigm

  • 分享至 

  • xImage
  •  

前言

在程式歷史的進程中,就像是動物歷史一樣,是在漫漫的演變當中前進。動物會根據環境最適者生存,程式也會慢慢演進,根據環境、硬體資源等原因逐漸找出一個pattern是最適合某個條件的。Programming paradigm 就是指總結出來經典的程式典範,主要分成兩大類指令式(Imperative programming paradigm)、宣告式(Declarative programming paradigm),裡面又會再細分不同的種類。

Imperative programming

指令式,顧名思義就是一步步告訴程式如何運作,運用條件(if、switch)、迴圈(for)來做流程控制,會有變數(variable)來記錄狀態,這通常也是剛接觸程式所先學習到的,其優點也是可以具象化需求、容易想像也比較容易撰寫,適合入門使用。做為Java開發者最耳熟能詳的物件導向程式設計(Object oriented programming)也是屬於指令式。

Declarative programming paradigm

宣告式/聲明式,較為抽象,相對於指令式的繁瑣,宣告式重點在於目標而不是流程。在學習這部分的時候我一直用Java角度來思考就會很難理解,這邊建議用SQL查詢來思考就單純的多,只需要SELECT * FROM 就可以查詢資料庫,不需要知道資料庫背後運作的流程與細節,還有後面會介紹到的Funtional ProgrammingReactive Programming,也都是宣告式,自己認為語言本身要有一定程度支援才能寫出宣告式的程式。

通常只看到定義還是會很難了解差異,這邊列出我整理出來的比較表

Imperative  vs Declarative

  1. WHAT + HOW vs WHAT + NOT HOW
    大部分文章都是說一個是what,一個是how,但我認為兩者都會有what,都需要告訴程式你要做什麼,命令式你需要告訴他如何去做,宣告式則不用。
  2. state vs stateless
    指令式透過狀態來控制而宣告式強調無狀態
  3. cphpjava vs  scalahaskell

用簡單的範例來比較,有一個1~10的list,印出其中是偶數的部分,指令式透過for迴圈搭配if,聲明式透過streamfilterforEach的方式。

public static void main(String[] args) { 
    List<Integer> data = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
	List<Integer> result = new ArrayList<>(); 
	for (int i = 0; i < data.size(); i++) { 
        if ((data.get(i)) % 2 == 0) { 
            result.add(data.get(i)); 
        } 
	} 
	for (int i = 0; i < result.size(); i++) { 
        System.out.println(result.get(i)); 
    } 
}
public static void main(String[] args) { 
    List<Integer> data = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
        data 
			.stream() 
			.filter(i -> i % 2 ==0) 
			.forEach(System.out::println); 
	}

結論

本篇主要是簡單介紹一下Programming paradigm,可以在後面幫助了解Reactive Programming,指令式與宣告式這兩種沒有絕對的誰優誰劣,取決於需求與環境,下一篇會來介紹Funtional Programming

資料來源


上一篇
[Day 0] Reactive Programming 資料來源
下一篇
[Day 3] Reactive Programming - Functional Programming
系列文
從零開始Reactive Programming- Spring32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言